#ifndef VJBSDHDR_H
#define VJBSDHDR_H

#include "lwip/tcp.h"

/*
 * Structure of an internet header, naked of options.
 *
 * We declare ip_len and ip_off to be short, rather than u_short
 * pragmatically since otherwise unsigned comparisons can result
 * against negative integers quite easily, and fail in subtle ways.
 */
PACK_STRUCT_BEGIN
struct ip {
#if defined(NO_CHAR_BITFIELDS)
	u_char   ip_hl_v;  /* bug in GCC for mips means the bitfield stuff will sometimes break - so we use a char for both and get round it with macro's instead... */
#else
#if BYTE_ORDER == LITTLE_ENDIAN
	unsigned ip_hl: 4,             /* header length */
	         ip_v : 4;             /* version */
#elif BYTE_ORDER == BIG_ENDIAN
	unsigned ip_v : 4,             /* version */
	         ip_hl: 4;             /* header length */
#else
	COMPLAIN - NO BYTE ORDER SELECTED!
#endif
#endif
	u_char  ip_tos;                /* type of service */
	u_short ip_len;                /* total length */
	u_short ip_id;                 /* identification */
	u_short ip_off;                /* fragment offset field */
#define  IP_DF 0x4000            /* dont fragment flag */
#define  IP_MF 0x2000            /* more fragments flag */
#define  IP_OFFMASK 0x1fff       /* mask for fragmenting bits */
	u_char  ip_ttl;                /* time to live */
	u_char  ip_p;                  /* protocol */
	u_short ip_sum;                /* checksum */
	struct  in_addr ip_src, ip_dst; /* source and dest address */
};
PACK_STRUCT_END

typedef u32_t tcp_seq;

/*
 * TCP header.
 * Per RFC 793, September, 1981.
 */
PACK_STRUCT_BEGIN
struct tcphdr {
	u_short  th_sport;    /* source port */
	u_short  th_dport;    /* destination port */
	tcp_seq  th_seq;      /* sequence number */
	tcp_seq  th_ack;      /* acknowledgement number */
#if defined(NO_CHAR_BITFIELDS)
	u_char   th_x2_off;
#else
#if BYTE_ORDER == LITTLE_ENDIAN
	unsigned th_x2 : 4,   /* (unused) */
	         th_off: 4;   /* data offset */
#endif
#if BYTE_ORDER == BIG_ENDIAN
	unsigned th_off: 4,   /* data offset */
	         th_x2 : 4;   /* (unused) */
#endif
#endif
	u_char   th_flags;
	u_short  th_win;      /* window */
	u_short  th_sum;      /* checksum */
	u_short  th_urp;      /* urgent pointer */
};
PACK_STRUCT_END

#endif /* VJBSDHDR_H */
